package com.carmanagement



import grails.test.mixin.*
import spock.lang.*

@TestFor(FullTankController)
@Mock([FullTank, Vehicle])
class FullTankControllerSpec extends Specification {

    def populateValidParams(params) {
		assert params != null
		params.vehicle = new Vehicle(registerNumber:"test")
    }

    def setup(){
    	Vehicle.metaClass.'static'.findById = { a -> new Vehicle()}
    }

    void "Test the create action returns the correct model"() {
		when:"The create action is executed"
		controller.create()

		then:"The model is correctly created"
		model.fullTankInstance!= null
    }

    void "Test the save action correctly persists an instance"() {

		when:"The save action is executed with an invalid instance"
		def fullTank = new FullTank()
		fullTank.validate()
		controller.save(fullTank)

		then:"The create view is rendered again with the correct model"
		model.fullTankInstance!= null
		view == 'create'

		when:"The save action is executed with a valid instance"
		response.reset()
		populateValidParams(params)
		fullTank = new FullTank(params)
		controller.params.date = "2000/01/01"
		controller.save(fullTank)

		then:"A redirect is issued to the show action"
		println view
		response.redirectedUrl == '/vehicle/show/1'
		controller.flash.message != null
		FullTank.count() == 1
    }

    void "Test that the show action returns the correct model"() {
		when:"The show action is executed with a null domain"
		controller.show(null)

		then:"A 404 error is returned"
		response.status == 404

		when:"A domain instance is passed to the show action"
		populateValidParams(params)
		def fullTank = new FullTank(params)
		controller.show(fullTank)

		then:"A model is populated containing the domain instance"
		model.fullTankInstance == fullTank
    }

    void "Test that the edit action returns the correct model"() {
		when:"The edit action is executed with a null domain"
		controller.edit(null)

		then:"A 404 error is returned"
		response.status == 404

		when:"A domain instance is passed to the edit action"
		populateValidParams(params)
		def fullTank = new FullTank(params)
		controller.edit(fullTank)

		then:"A model is populated containing the domain instance"
		model.fullTankInstance == fullTank
	    }

	    void "Test the update action performs an update on a valid domain instance"() {
		when:"Update is called for a domain instance that doesn't exist"
		controller.update(null)

		then:"A 404 error is returned"
		response.redirectedUrl == '/fullTank/index'
		flash.message != null


		when:"An invalid domain instance is passed to the update action"
		response.reset()
		def fullTank = new FullTank()
		fullTank.validate()
		controller.update(fullTank)

		then:"The edit view is rendered again with the invalid instance"
		view == 'edit'
		model.fullTankInstance == fullTank

		when:"A valid domain instance is passed to the update action"
		response.reset()
		populateValidParams(params)
		fullTank = new FullTank(params).save(flush: true)
		controller.update(fullTank)

		then:"A redirect is issues to the show action"
		response.redirectedUrl == "/fullTank/show/$fullTank.id"
		flash.message != null
    }

    void "Test that the delete action deletes an instance if it exists"() {
		when:"The delete action is called for a null instance"
		controller.delete(null)

		then:"A 404 is returned"
		response.redirectedUrl == '/vehicle/index'
		flash.message != null

		when:"A domain instance is created"
		response.reset()
		populateValidParams(params)
		def fullTank = new FullTank(params).save(flush: true)

		then:"It exists"
		FullTank.count() == 1

		when:"The domain instance is passed to the delete action"
		controller.delete(fullTank)

		then:"The instance is deleted"
		FullTank.count() == 0
		response.redirectedUrl == '/vehicle/show/'
		flash.message != null
    }
}
